#ifndef XMLINFOCONTRAT_HPP
#define XMLINFOCONTRAT_HPP

#include "XmlInfoCaracteristiques.hpp"

#include <QtCore/QHash>

/**
 * Type énuméré décrivant le type de contrat. La valeur correspond au
 * nombre de caractéristiques requises (sauf pour Infernal).
 */
enum EnumTypeContrat
  {
    Enfantin   = 0, /**< Contrat simplissime, ne requérant aucun
		       trait. */
    Abordable  = 1, /**< Contrat simple, un seul prérequis. */
    Normal     = 2, /**< Contrat normal, deux prérequis. */
    Difficile  = 3, /**< Contrat difficile, trois prérequis. */
    Monstrueux = 4, /**< Contrat très difficile, quatre prérequis. */
    Infernal   = 5  /**< Contrat extrèmement difficile, quatre
		       prérequis. */
  };

/**
 * Classe représentant un contrat. Le contrat est caractérisé par ses
 * prérequis, une difficulté, une récompense, ...
 *
 * @author Johan "Solo" Luisier
 * @date Octobre 2011
 */
class XmlInfoContrat : public XmlInfoCaracteristiques
{
public:
    /** Constructeur standard.
      * Initialise la classe mère et le nom.
      *
      * @param[in] nomFichier nom du fichier XML.
      * @param[in] id identifiant de l'objet.
      * @param[in] nom nom de l'instance.
      * @param[in] sadisme score de sadisme.
      * @param[in] laideur score de laideur.
      * @param[in] force score de force.
      * @param[in] gourmandise score de gourmandise.
      * @param[in] age age de l'enfant.
      * @param[in] sexe sexe de l'enfant.
      * @param[in] ville ville où habite l'enfant.
      * @param[in] pays pays dans lequel habite l'enfant.
      * @param[in] fuseauHoraire fuseau horaire associé à la ville.
      * @param[in] secondesRestantes nombre de secondes avant l'exécution du
      * contrat.    
      * @param[in] typeContrat type de contrat.
      * @param[in] recompense nombre de monstercrédits touché pour la réussite
      * du contrat.
      * @param[in] difficulte difficulté du contrat.
      */
  XmlInfoContrat( const QString& nomFichier,
		  const unsigned& id,
		  const QString& nom,
		  const unsigned& sadisme,
		  const unsigned& laideur,
		  const unsigned& force,
		  const unsigned& gourmandise,
		  const unsigned& age,
		  const unsigned sexe,
		  const QString& ville,
		  const QString& pays,
		  const int& fuseauHoraire,
		  const unsigned& secondesRestantes,
                  const EnumTypeContrat& typeContrat,
		  const unsigned& recompense,
		  const unsigned& difficulte );
  /**
    * Permet de dupliquer une instance de @c XmlInfoContrat.
    *
    * @param[in] contrat instance à dupliquer.
    */
  XmlInfoContrat( const XmlInfoContrat& contrat );
  /** Destructeur.
    * Le destructeur n'a rien de spécial à faire.
    */
  virtual ~XmlInfoContrat();
  /** Opérateur d'affectation.
    * Permet de copier le contenu d'une instance dans une autre.
    *
    * @param[in] contrat instance à copier dans l'instance courante.
    *
    * @return une référence sur l'instance courante.
    */
  XmlInfoContrat& operator=( const XmlInfoContrat& contrat );
  /** Méthode permettant de créer une instance depuis une balise XML.
    * Une balise permet de définir une instance à partir de ses attributs :
    * chaque attribut correspond à un membre de la classe.
    *
    * @param[in] nomFichier nom du fichier XML.
    * @param[in] infos liste des valeurs utilisées, indexée par le nom de
    * l'attribut.
    *
    * @return une instance de @c XmlInfoContrat qui est vide si une erreur
    * se produit lors de la lecture des informations.
    */
  static XmlInfoContrat creeInstance( const QString& nomFichier,
				      const QHash< QString, QString >* infos );
  /** Permet d'afficher les informations contenues dans un flot de
   * sortie.
   * Est utilisé lors de la phase de debug.
   */
  void afficheInstance() const;
  /** Permet d'accéder au score voulu, pouvant être utilisé dans une boucle.
    *
    * @param[in] car EnumCaracteristique de la compétence voulue.
    *
    * @return une référence constante sur le "trait" voulu.
    */
  virtual const unsigned& caracteristique( const EnumCaracteristique& car ) const;
  /** Permet d'accéder au score voulu, pouvant être utilisé dans une
   * boucle. Cette fois l'argument est de type @c unsigned.
   * Pour s'assurer que la caractéristique voulue a bien un index entre 0 et 6
   * le modulo 7 est pris.
   *
   * @param[in] car "numéro" de la compétence voulue, converti en
   * EnumCaracteristique.
   *
   * @return une référence constante sur le "trait" voulu.
   */
  virtual const unsigned& caracteristique( const unsigned& car ) const;
  /** Permet d'accéder à Age.
    *
    * @return une référence constante sur Age.
    */
  const unsigned& age() const;
  /** Permet d'accéder à Sexe.
    *
    * @return une référence constante sur Sexe.
    */
  const unsigned& sexe() const;
  /** Permet d'accéder à Ville.
    *
    * @return une référence constante sur Ville.
    */
  const QString& ville() const;
  /** Permet d'accéder à Pays.
    *
    * @return une référence constante sur Pays.
    */
  const QString& pays() const;
  /** Permet d'accéder à FuseauHoraire.
    *
    * @return une référence constante sur FuseauHoraire.
    */
  const int& fuseauHoraire() const;
  /** Permet d'accéder à TypeContrat.
    *
    * @return une référence constante sur TypeContrat.
    */
  const EnumTypeContrat& typeContrat() const;
  /** Permet de savoir combien de compétences sont requises.
    *
    * @return le nombre de compétences requises.
    */
  unsigned nbrCompetencesRequises() const;
  /** Permet d'accéder à SecondesRestantes.
    *
    * @return une référence constante sur SecondesRestantes.
    */
  const unsigned& secondesRestantes() const;
  /** Permet d'accéder à Recompense.
    *
    * @return ue référence constante sur Recompense.
    */
  const unsigned& recompense() const;
  /** Permet d'accéder à Difficulte.
    *
    * @return une référence constante sur Difficulte.
    */
  const unsigned& difficulte() const;
  /** Permet d'accéder à Accepte.
    *
    * @return une référence constante sur Accepte.
    */
  const bool& accepte() const;
  /** Permet d'accéder à IdMonstre.
    *
    * @return une référence constante sur IdMonstre.
    */
  const unsigned& idMonstre() const;
  /** Permet de changer la valeur de Age.
    *
    * @param[in] age nouvelle valeur de Age.
    */
  void setAge( const unsigned& age );
  /** Permet de changer la valeur de Sexe.
    *
    * @param[in] sexe nouvelle valeur de Sexe.
    */
  void setSexe( const unsigned& sexe );
  /** Permet de changer la valeur de Ville.
    *
    * @param[in] ville nouvelle valeur de Ville.
    */
  void setVille( const QString& ville );
  /** Permet de changer la valeur de Pays.
    *
    * @param[in] pays nouvelle valeur de Pays.
    */
  void setPays( const QString& pays );
  /** Permet de changer la valeur de FuseauHoraire.
    *
    * @param[in] fuseauHoraire nouvelle valeur de FuseauHoraire.
    */
  void setFuseauHoraire( const int& fuseauHoraire );
  /** Permet de changer la valeur de TypeContrat.
    *
    * @param[in] typeContrat nouvelle valeur de TypeContrat.
    */
  void setTypeContrat( const EnumTypeContrat& typeContrat );
  /** Permet de changer la valeur de TypeContrat.
    * Cette version permet de modifier le type de contrat en donnant un argument
    * de type @c unsigned, car le template appelleSetUnsigned ne peut pas gérer
    * les énumérations.
    *
    * @param[in] typeContrat nouvelle valeur de TypeContrat.
    */
  void setTypeContrat( const unsigned& typeContrat );
  /** Permet de changer la valeur de SecondesRestantes.
    *
    * @param[in] secondesRestantes nouvelle valeur de SecondesRestantes.
    */
  void setSecondesRestantes( const unsigned& secondesRestantes );
  /** Permet de changer la valeur de Recompense.
    *
    * @param[in] recompense nouvelle valeur de Recompense.
    */
  void setRecompense( const unsigned& recompense );
  /** Permet de changer la valeur de Difficulte.
    *
    * @param[in] difficulte nouvelle valeur de Difficulte.
    */
  void setDifficulte( const unsigned& difficulte );
  /** Permet de changer la valeur de IdMonstre.
    *
    * @param[in] idMonstre nouvelle valeur de IdMonstre.
    */
  void setIdMonstre( const unsigned& idMonstre );
protected:
  XmlInfoContrat();
  /**
   * Age de la victime.
   */
  unsigned Age;
  /**
   * Sexe de la victime (0=masculin, 1=féminin).
   */
  unsigned Sexe;
  /**
   * Nom de la ville où habite la victime.
   */
  QString Ville;
  /**
   * Nom du pays dans lequel habite la victime.
   */
  QString Pays;
  /**
   * Fuseau horaire dans lequel vit la victime.
   */
  int FuseauHoraire;
  /**
   * Nombre de secondes avant l'exécution du contrat.
   */
  unsigned SecondesRestantes;
  /**
   * Type de contrat.
   */
  EnumTypeContrat TypeContrat;
  /**
   * Nombre de monster crédits que rapporte le contrat.
   */
  unsigned Recompense;
  /**
   * Difficulté du contrat, utilisée pour calculer le pourcentage de
   * réussite.
   */
  unsigned Difficulte;
  /**
   * Contient \e true si le contrat a été accepté, \e false sinon.
   */
  bool Accepte;
  /**
   * Contient l'id du monstre remplissant le contrat, ou -1u tant
   * qu'aucun monstre n'est affecté à ce contrat.
   */
  unsigned IdMonstre;
};

#endif // XMLINFOCONTRAT_HPP
